package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

func dumpBytesArray(arr []byte) {
	fmt.Print("[")
	for _, b := range arr {
		fmt.Printf("%c", b) // 以字符形式打印每个字节
	}
	fmt.Print("]\n")
}

func main() {
	var s = "hello"

	// unsafe.Pointer 是一种特殊类型的指针，可以转换为任意类型的指针
	// 这里用它来将 string 类型变量地址显式转换为 StringHeader 结构体指针
	hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))

	fmt.Printf("0x%x\n", hdr.Data) // 0x6a0d57

	p := (*[5]byte)(unsafe.Pointer(hdr.Data)) // 获取Data字段所指向的数组的指针

	// (*p)[:]：将数组指针转换为切片，以便传递给 dumpBytesArray
	dumpBytesArray((*p)[:]) // [hello]  输出底层数组的字符形式

	dumpBytesArray([]byte(s)) // 日常开发使用 []byte(s) 的方式来获取字符串的字节表示
}
